home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / et / src / list.c < prev    next >
Text File  |  1993-07-08  |  13KB  |  523 lines

  1. #include  "et.h"
  2. int   make_menu_list()/*et*/
  3. {
  4.   int   i, j, k, n, menu_n;
  5.   NAME  *Name, *(*func)();
  6.   
  7.   set_icn_name(G_mn[mn_ICN].name);
  8.   for (k = 2; k; k--) {
  9.     switch(k) {
  10.     case 2:
  11.       G_nb.mn = 0;
  12.       func = set_nb_name;
  13.       break;
  14.     case 1:
  15.       menu_n = G_nb.mn;
  16.       Name = G_mn[mn_LOGO].name;
  17.       func = set_name_p;
  18.       break;
  19.     }
  20.     for (i = 0; G_mn[i].s; i++) {
  21.       switch(k) {
  22.       case 2:
  23.         G_nb.mn++;
  24.         break;
  25.       case 1:
  26.         if (i != mn_LOGO && i != mn_ICN)
  27.           G_mn[i].name = Name;
  28.         break;
  29.       }
  30.       switch(i) {
  31.       case mn_ERR_1:
  32.         Name = func(Name, mn_ERR);
  33.         break;
  34.       case mn_ERR_2:
  35.         Name = func(Name, mn_ERR);
  36.         break;
  37.       case mn_ERR_3:
  38.         G_mn[mn_ERR].p += 120;
  39.         Name = func(Name, mn_ERR);
  40.         G_mn[mn_ERR].p -= 120;
  41.         break;
  42.       case mn_ERR_4:
  43.         Name = func(Name, mn_ERR);
  44.         break;
  45.       case mn_LOGO:
  46.         if (k == 2) {
  47.           Name = func(Name, mn_DEMO);
  48.           Name = func(Name, mn_MAKE);
  49.           Name = func(Name, mn_REPLAY);
  50.           Name = func(Name, mn_START);
  51.           Name = func(Name, mn_END);
  52.         } else
  53.           Name = set_start_name(Name);
  54.         break;
  55.       case mn_ESC:/* "終了" */
  56.       case mn_S_ESC:/* "終了" */
  57.         Name = func(Name, mn_END_RET);
  58.         Name = func(Name, mn_END_ESC);
  59.         break;
  60.       case mn_SS: /* "S 保存" */
  61.       case mn_LL: /* "L 読込" */
  62.       case mn_CC: /* "C カーソル" */
  63.       case mn_EE: /* "E 登録" */
  64.         for (j = 1; G_mn[j].s; j++)
  65.           switch(j) {
  66.           case mn_ESC:
  67.           case mn_UP:
  68.           case mn_LT:
  69.           case mn_DN:
  70.           case mn_RT:
  71.           case mn_BS:
  72.           case mn_RET:
  73.           case mn_C_MM:
  74.           case mn_S_RET:
  75.           case mn_C_EE:
  76.           case mn_C_DD:
  77.           case mn_C_SS:
  78.           case mn_C_XX:
  79.             Name = func(Name, j);
  80.             break;
  81.           }
  82.         if (k == 2)
  83.           Name = func(Name, j);
  84.         else {
  85.           _copy_buf(Name, G_mn[mn_ICN].name, sizeof(NAME));
  86.           Name++;
  87.         }
  88.         break;
  89.       case mn_FF: /* "F フォント" */
  90.         for (j = 1; G_mn[j].s; j++)
  91.           switch(j) {
  92.           case mn_ESC:
  93.           case mn_BS:
  94.           case mn_S_BS:
  95.           case mn_UP:
  96.           case mn_LT:
  97.           case mn_DN:
  98.           case mn_RT:
  99.           case mn_S_UP:
  100.           case mn_S_LT:
  101.           case mn_S_DN:
  102.           case mn_S_RT:
  103.           case mn_S_FR:
  104.           case mn_S_BK:
  105.           case mn_0:
  106.           case mn_1:
  107.           case mn_2:
  108.           case mn_3:
  109.           case mn_4:
  110.           case mn_5:
  111.           case mn_6:
  112.           case mn_7:
  113.           case mn_8:
  114.           case mn_9:
  115.           case mn_A:
  116.           case mn_B:
  117.           case mn_C:
  118.           case mn_D:
  119.           case mn_E:
  120.           case mn_F:
  121.           case mn_RET:
  122.           case mn_C_MM:
  123.           case mn_S_RET:
  124.             Name = func(Name, j);
  125.             break;
  126.           }
  127.         Name = func(Name, mn_MN_FF);
  128.         break;
  129.       case mn_AA: /* "A 動画" */
  130.       case mn_NN: /* "N 反転" */
  131.       case mn_OO: /* "O 標準" */
  132.         for (j = 1; G_mn[j].s; j++)
  133.           switch(j) {
  134.           case mn_ESC:
  135.           case mn_RET:
  136.           case mn_C_MM:
  137.             Name = func(Name, j);
  138.             break;
  139.           }
  140.         break;
  141.       case mn_PP: /* "P 遠近" */
  142.       case mn_DD: /* "D 距離" */
  143.       case mn_XX: /* "X 横幅" */
  144.       case mn_YY: /* "Y 縦幅" */
  145.       case mn_ZZ: /* "Z 奥幅" */
  146.       case mn_GG: /* "G 角度" */
  147.         for (j = 1; G_mn[j].s; j++)
  148.           switch(j) {
  149.           case mn_ESC:
  150.           case mn_BS:
  151.           case mn_S_BS:
  152.           case mn_PP:
  153.           case mn_DD:
  154.           case mn_XX:
  155.           case mn_YY:
  156.           case mn_ZZ:
  157.           case mn_GG:
  158.           case mn_UP:
  159.           case mn_DN:
  160.           case mn_RET:
  161.           case mn_C_MM:
  162.           case mn_S_RET:
  163.           case mn_00:
  164.           case mn_11:
  165.           case mn_22:
  166.           case mn_33:
  167.           case mn_44:
  168.           case mn_55:
  169.           case mn_66:
  170.           case mn_77:
  171.           case mn_88:
  172.           case mn_99:
  173.           case mn_LT_CC:
  174.           case mn_RT_CC:
  175.             if (i != j)
  176.               Name = func(Name, j);
  177.             break;
  178.           }
  179.         Name = func(Name, mn_MN_CC);
  180.         break;
  181.       case mn_BAR:  /* "            描画" */
  182.         for (j = 1; G_mn[j].s; j++)
  183.           switch(j) {
  184.           case mn_ESC:
  185.           case mn_RET:
  186.           case mn_C_MM:
  187.             Name = func(Name, j);
  188.             break;
  189.           }
  190.         break;
  191.       case mn_TT: /* "T TRIPHONY" */
  192.         for (j = 1; G_mn[j].s; j++)
  193.           switch(j) {
  194.           case mn_ESC:
  195.           case mn_RET:
  196.           case mn_C_MM:
  197.           case mn_S_RET:
  198.           case mn_DISK:
  199.           case mn_LT_TT:
  200.           case mn_RT_TT:
  201.           case mn_UP_TT:
  202.           case mn_DN_TT:
  203.             Name = func(Name, j);
  204.             break;
  205.           }
  206.         Name = func(Name, mn_MN_TT);
  207.         break;
  208.       case mn_AT: /* " @  補間" */
  209.       case mn_WW: /* " W  視差" */
  210.         for (j = 1; G_mn[j].s; j++)
  211.           switch(j) {
  212.           case mn_ESC:
  213.           case mn_BS:
  214.           case mn_RET:
  215.           case mn_C_MM:
  216.           case mn_S_RET:
  217.           case mn_00:
  218.           case mn_11:
  219.           case mn_22:
  220.           case mn_33:
  221.           case mn_44:
  222.           case mn_55:
  223.           case mn_66:
  224.           case mn_77:
  225.           case mn_88:
  226.           case mn_99:
  227.           case mn_LT_CC:
  228.           case mn_RT_CC:
  229.             Name = func(Name, j);
  230.             break;
  231.           }
  232.         Name = func(Name, mn_MN_CC);
  233.         break;
  234.       case mn_MN_AA:  /* "A 動画" && !"DEL 消去" && !f_AREA */
  235.       case mn_MN_NN:  /* "N 反転" && !"DEL 消去" && !f_AREA */
  236.       case mn_MN_OO:  /* "O 標準" && !"DEL 消去" && !f_AREA */
  237.         for (j = 1; G_mn[j].s; j++)
  238.           switch(j) {
  239.           case mn_END_RET:
  240.           case mn_END_ESC:
  241.           case mn_C_XX:
  242.           case mn_C_SS:
  243.           case mn_C_EE:
  244.           case mn_C_DD:
  245.           case mn_RET:
  246.           case mn_C_MM:
  247.           case mn_S_RET:
  248.           case mn_AT:/**/
  249.           case mn_JJ:/**/
  250.           case mn_HH:/**/
  251.             break;
  252.           default:
  253.             if (j < mn_FREE_AREA && j != (mn_AA + i-mn_MN_AA))
  254.               Name = func(Name, j);
  255.             break;
  256.           }
  257.         break;
  258.       case mn_MN_DEL_AA:  /* "A 動画" && "DEL 消去" */
  259.       case mn_MN_DEL_NN:  /* "N 反転" && "DEL 消去" */
  260.       case mn_MN_DEL_OO:  /* "O 標準" && "DEL 消去" */
  261.         for (j = 1; G_mn[j].s; j++)
  262.           switch(j) {
  263.           case mn_END_RET:
  264.           case mn_END_ESC:
  265.           case mn_C_XX:
  266.           case mn_C_SS:
  267.           case mn_C_EE:
  268.           case mn_C_DD:
  269.           case mn_BS:
  270.           case mn_S_BS:
  271.           case mn_SS:
  272.           case mn_EE:
  273.           case mn_S_EE:
  274.           case mn_RET:
  275.           case mn_C_MM:
  276.           case mn_S_RET:
  277.           case mn_AT:/**/
  278.           case mn_JJ:/**/
  279.           case mn_HH:/**/
  280.             break;
  281.           default:
  282.             if (j < mn_FREE_AREA && j != (mn_AA + i-mn_MN_DEL_AA))
  283.               Name = func(Name, j);
  284.             break;
  285.           }
  286.         break;
  287.       case mn_MN_AREA_AA: /* "A 動画" && f_AREA */
  288.       case mn_MN_AREA_NN: /* "N 反転" && f_AREA */
  289.       case mn_MN_AREA_OO: /* "O 標準" && f_AREA */
  290.         for (j = 1; G_mn[j].s; j++)
  291.           switch(j) {
  292.           case mn_END_RET:
  293.           case mn_END_ESC:
  294.           case mn_C_XX:
  295.           case mn_C_SS:
  296.           case mn_C_EE:
  297.           case mn_C_DD:
  298.           case mn_FF:
  299.           case mn_UP:
  300.           case mn_LT:
  301.           case mn_FR:
  302.           case mn_S_UP:
  303.           case mn_S_LT:
  304.           case mn_S_FR:
  305.           case mn_DN:
  306.           case mn_RT:
  307.           case mn_BK:
  308.           case mn_S_DN:
  309.           case mn_S_RT:
  310.           case mn_S_BK:
  311.           case mn_TAB:
  312.           case mn_INS:
  313.           case mn_C_UP:
  314.           case mn_C_LT:
  315.           case mn_C_FR:
  316.           case mn_RET:
  317.           case mn_C_MM:
  318.           case mn_S_RET:
  319.           case mn_C_DN:
  320.           case mn_C_RT:
  321.           case mn_C_BK: 
  322.           case mn_AT:/**/
  323.           case mn_JJ:/**/
  324.           case mn_HH:/**/
  325.             break;
  326.           default:
  327.             if (j < mn_FREE_AREA && j != (mn_AA + i-mn_MN_AREA_AA))
  328.               Name = func(Name, j);
  329.             break;
  330.           }
  331.         break;
  332.       }
  333.       if (k == 1) {
  334.         Name->next = 0;
  335.         Name++;
  336.       }
  337.     }
  338.   }
  339.   return(menu_n);
  340. }
  341. NAME  *set_start_name(NAME *Name)/*et*/
  342. {
  343.   FILE  *File;
  344.   unsigned  f;
  345.   
  346.   Name = set_name_p(Name, mn_DEMO);
  347.   if (G_nb.current != 16 && _disk_free(1)) {
  348.     File = fopen(P_c[c_FILE_REPLAY], "rb");
  349.     if (G_nb.current != 16 && !File)
  350.       Name = set_name_p(Name, mn_MAKE);
  351.     if (G_nb.current == 16 || !File) {
  352.       if (File)
  353.         fclose(File);
  354.     } else {
  355.       if (File) {
  356.         fread(&f, sizeof(unsigned), 1, File);
  357.         fclose(File);
  358.       } else
  359.         f = 0;
  360.       if (f == f_REPLAY)
  361.         Name = set_name_p(Name, mn_REPLAY);
  362.     }
  363.     if (G_nb.current != 16)
  364.       Name = set_name_p(Name, mn_START);
  365.     Name = set_name_p(Name, mn_END);
  366.   }
  367.   return(Name);
  368. }
  369. void  set_icn_name(NAME *Name)/*et*/
  370. {
  371.   int   i;
  372.   
  373.   for (i = 0; i < MAX_ICN+1; i++)
  374.     Name = set_icn_namep(Name, i);
  375.   Name->next = NULL;
  376. }
  377. NAME  *set_icn_namep(NAME *Name, int file_i)/*et*/
  378. {
  379.   int   p_i, q_i;
  380.   
  381.   p_i = file_i % 8;
  382.   q_i = file_i / 8;
  383.   Name->key = ICN_I + file_i;
  384.   Name->n = mn_ICN;
  385.   Name->pq[0] = P_i[i_WIN_VIEW][0] + P_i[i_SIZE_ICN][2] * 8 * p_i+1;
  386.   Name->pq[1] = P_i[i_WIN_VIEW][1] + P_i[i_SIZE_ICN][3] * q_i+1;
  387.   Name->pq[2] = Name->pq[0] + P_i[i_SIZE_ICN][2] * 8 - 2;
  388.   Name->pq[3] = Name->pq[1] + P_i[i_SIZE_ICN][3] - 2;
  389.   Name->next = &Name[1];
  390.   return(Name->next);
  391. }
  392. NAME  *set_name_p(NAME *Name, int menu_i)/*et*/
  393. {
  394.   int   len, wid, half, add=0;
  395.   
  396.   Name->key = G_mn[menu_i].key;
  397.   Name->n = menu_i;
  398.   do {
  399.     switch(menu_i) {
  400.     case mn_UP:
  401.     case mn_LT:
  402.     case mn_C_EE:
  403.     case mn_C_SS:
  404.     case mn_FR:
  405.       wid = 0;
  406.       len = 4;
  407.       half = 0;
  408.       break;
  409.     case mn_S_UP:
  410.     case mn_S_LT:
  411.     case mn_S_FR:
  412.       wid = 4;
  413.       len = 3;
  414.       half = 4;
  415.       break;
  416.     case mn_S_DN:
  417.     case mn_S_RT:
  418.     case mn_S_BK:
  419.       wid = 0;
  420.       len = 3;
  421.       half = 4;
  422.       break;
  423.     case mn_C_UP:
  424.     case mn_C_LT:
  425.     case mn_C_FR:
  426.       wid = 3;
  427.       len = 3;
  428.       half = 4;
  429.       break;
  430.     case mn_C_DN:
  431.     case mn_C_RT:
  432.     case mn_C_BK:
  433.       wid = 0;
  434.       len = 3;
  435.       half = 4;
  436.       break;
  437.     case mn_FF:
  438.       Name->pq[0] = G_mn[menu_i].p - 1;
  439.       Name->pq[1] = G_mn[menu_i].q;
  440.       Name->pq[2] = G_mn[menu_i].p + 7;
  441.       Name->pq[3] = 399;
  442.       continue;
  443.       break;
  444.     case mn_POS:
  445.     case mn_RND:
  446.       wid = 0;
  447.       half = -3;
  448.       len = 1;
  449.       add = 3;
  450.       break;
  451.     case mn_RET:
  452.     case mn_C_MM:
  453.       Name->pq[0] = G_mn[menu_i].p-14;
  454.       Name->pq[1] = G_mn[menu_i].q-13;
  455.       Name->pq[2] = G_mn[menu_i].p+22;
  456.       Name->pq[3] = G_mn[menu_i].q+5;
  457.       continue;
  458.     case mn_S_RET:
  459.       Name->pq[0] = G_mn[menu_i].p-4;
  460.       Name->pq[1] = G_mn[menu_i].q+4;
  461.       Name->pq[2] = G_mn[menu_i].p+22;
  462.       Name->pq[3] = G_mn[menu_i].q+27;
  463.       continue;
  464.     case mn_MN_TT:
  465.       Name->pq[0] = 0;
  466.       Name->pq[1] = 0;
  467.       Name->pq[2] = 0;
  468.       Name->pq[3] = 0;
  469.       continue;
  470.     case mn_ERR:
  471.       Name->pq[0] = G_mn[menu_i].p - 1;
  472.       Name->pq[1] = G_mn[menu_i].q - 2;
  473.       Name->pq[2] = G_mn[menu_i].p + G_mn[menu_i].len*8 + 1;
  474.       Name->pq[3] = G_mn[menu_i].q + 17;
  475.       continue;
  476.     default:
  477.       wid = 0;
  478.       len = G_mn[menu_i].len;
  479.       half = 0;
  480.       break;
  481.     }
  482.     Name->pq[0] = G_mn[menu_i].p + wid*8 - 1 + half + add;
  483.     Name->pq[1] = G_mn[menu_i].q;
  484.     Name->pq[2] = G_mn[menu_i].p + wid*8 + len*8 + 1 + half;
  485.     Name->pq[3] = G_mn[menu_i].q+16;
  486.   } while (0);
  487.   Name->next = &Name[1];
  488.   return(Name->next);
  489. }
  490. NAME  *set_nb_name(NAME *Name, int i)/*et*/
  491. {
  492.   G_nb.mn++;
  493.   return(Name);
  494. }
  495. NAME  *find_key(int key)/*et*/
  496. {
  497.   NAME  *Name;
  498.   
  499.   for (Name=G_mn[G_nb.mn].name; Name->key!=key && Name->next; Name=Name->next)
  500.     ;
  501.   return((Name->key == key) ? Name : NULL);
  502. }
  503. NAME  *find_n(int menu_i)/*et*/
  504. {
  505.   NAME  *Name;
  506.   
  507.   for (Name=G_mn[G_nb.mn].name; Name->n!=menu_i && Name->next; Name=Name->next)
  508.     ;
  509.   return((Name->n == menu_i) ? Name : NULL);
  510. }
  511. NAME  *find_pq(int p, int q)/*et*/
  512. {
  513.   NAME  *Name;
  514.   
  515.   for (Name = G_mn[G_nb.mn].name; Name->next; Name = Name->next)
  516.     if (p > Name->pq[0])
  517.       if (p < Name->pq[2])
  518.         if (q > Name->pq[1])
  519.           if (q < Name->pq[3])
  520.             return(Name);
  521.   return(NULL);
  522. }
  523.